/*
 * @Author: 9ilk 3535851673@qq.com
 * @Date: 2024-11-10 21:58:31
 * @LastEditors: 9ilk 3535851673@qq.com
 * @LastEditTime: 2024-11-16 21:19:32
 * @FilePath: /zhuang/Signal/Signal.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string>
#include <vector>
#include <functional>
#include <cstdio>
using namespace std;

// 1.验证子进程,给父进程发送SIGCHILD

void handler(int signo)
{
  cout << "get a sign:" << signo << endl;
  while (true)
  {
    pid_t rid = ::waitpid(-1, nullptr, WNOHANG); //-1是任意一个等待的子进程
    if (rid > 0)                                 // 等待成功
    {
      cout << "子进程退出，回收成功.." << "child id:" << rid << endl;
    }
    else if (rid == 0) // 说明没有子进程退出了
    {
      cout << "退出的子进程已经被全部回收了..." << endl;
      break;
    }
    else if (rid < 0) // 等待错误
    {
      cout << "wait error.." << endl;
      break;
    }
  }
}

int cnt = 1;

int main()
{
  // ::signal(SIGCHLD, handler);
  ::signal(SIGCHLD, SIG_IGN);
  for (int i = 0; i < 10; i++)
  {
    if (fork() == 0)
    {
      sleep(1);
      cout << "子进程退出" << endl;
      // 子进程
      exit(0);
    }
  }

  // for (int i = 0; i < 10; i++)
  // {
  //   if (cnt < 6)
  //   {
  //     if (fork() == 0)
  //     {
  //       sleep(1);
  //       cout << "子进程退出" << endl;
  //       // 子进程
  //       exit(0);
  //     }
  //   }
  //   else
  //   {

  //     if (fork() == 0)
  //     {
  //       while (true)
  //       {
  //         cout << "i am child process,pid:" << getpid() << endl;
  //         sleep(2);
  //       }
  //     }
  //   }
  //   cnt++;
  // }

  while (true)
  {
    sleep(1);
  }
  return 0;
}
